<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 创建一个Person类
        class Person {
            // 构造器方法可以接收参数，并且使用this存放一份
            constructor(name, age) {
                this.name = name
                this.age = age
            }
            // 一般方法，一般方法会挂在实例好的对象的原型上,供实例使用，谁调用，this就是指向谁
            speak() {
                console.log(`我的名字是${this.name}，年龄是${this.age}`);
            }
        }

        // let sunwukong = new Person('孙悟空', 500)
        // let zhubajie = new Person('猪八戒', 88)
        // console.log('孙悟空', sunwukong);
        // console.log('猪八戒', zhubajie);
        // sunwukong.speak()

        // 创建一个student类，继承Person类

        class Student extends Person {
            constructor(name, age, score) {
                // super的位置要在上面
                super(name, age) // super关键字再将接住的传递给父类Person，即使用super传参调用父类
                this.score = score
            }
            speak() { // 方法的重写
                console.log('我是学生，重写了父类的方法');
            }
            study() {
                console.log(`好好学习，就能考${this.score}分`);
            }
        }

        let tom = new Student('tom', 18, 100)
        console.log('tom', tom);
        tom.speak()
        tom.study()

        /*
            1. 类中的构造器不是必须要写的，要对实例进行一些初始化操作，如添加指定属性时，才写
            2. 如果子类继承了父类，且子类中写了构造器，那么子类中的构造器constructor中必须要写spuer，且在首位
            3. 类中所定义的方法，都是放在了类的原型上，供实例化的对象去使用
        */ 

    </script>
</body>

</html>